package com.day13;

/**
 * 类的内部成员之五:内部类
 * 1.java中允许将一个类A声明在另一个类B中，则类A就是内部类，类B称为外部类
 * <p>
 * <p>
 * 2.内部类的分类:
 * 成员内部类(静态，非静态) vs 局部内部类(方法内，代码块内，构造器内)
 * <p>
 * 3.成员内部类:
 * 一方面，作为外部类的成员
 * 调用外部类的结构
 * 可以用static修饰
 * 可以被4种不同的权限修饰。
 *
 * <p>
 * <p>
 * 一方面，作为一个类出现。
 * 类内可以定义属性
 * 可以被final修饰，此类不能被继承，言外之意，不使用final，可以被继承
 * 可以被抽象abstract修饰，不能实例化了
 * <p>
 * <p>
 * <p>
 * 4.关注如下3个问题
 * 4.1如何实例化成员内部类的对象
 * 4.2如何在成员内部类中区分调用外部类结构
 * 4.3开发中局部内部类的使用
 */
public class InnerClassTest {

    public static void main(String[] args) {
        //创建Dog实例(静态的成员内部类)
        Person.Dog dog = new Person.Dog();
        dog.show();

        //创建非静态成员内部类的对象
        Person person = new Person();
        Person.Bird bird = person.new Bird();

        Person.Bird bird1 = new Person().new Bird();
        bird1.sing();

        bird1.display("杜鹃");

        
        Person.Dog dog1 = new Person.Dog();

        Person.Bird bird2 = new Person().new Bird();
    }


}

class Person {


    String name;

    public void eat() {
        System.out.println("人，吃饭");
    }


    //成员内部类
    static class Dog {
        String name;
        int age;

        public void show() {
            System.out.println("卡拉是条狗");
//            eat();
        }
    }


    //非静态内部类
    class Bird {
        String name;


        public void sing() {
            System.out.println("我是一只小小鸟");
            Person.this.eat();  //调用外部类的属性，非静态的
        }

        public void display(String name) {
            System.out.println(name);
            System.out.println(this.name);
            System.out.println(Person.this.name);
        }

    }

    public void method() {

        //局部内部类
        class AA {

        }
    }

    {
        //局部内部类
        class BB {

        }
    }


    public Person() {
        //局部内部类
        class CC {

        }
    }


    

}
